// 一个容器，包裹一个值 
class Container {
    // of 静态方法，可以省略 new 关键字创建对象 
    static of(value) {
        return new Container(value)
    }
    constructor(value) {
        this._value = value
    }
    // map 方法，传入变形关系，将容器里的每一个值映射到另一个容器 
    map(fn) {
        return Container.of(fn(this._value))
    }
}


class Maybe {
    static of(value) {
        return new Maybe(value)
    }
    constructor(value) {
        this._value = value
    }
    // 如果对空值变形的话直接返回 值为 null 的函子 
    map(fn) {
        return this.isNothing() ? Maybe.of(null) : Maybe.of(fn(this._value))
    }
    isNothing() {
        return this._value === null || this._value === undefined
    }
}

module.exports = { Maybe, Container }